昨天介紹完 modifier 和特性,今天來介紹一下 some View 這個神奇的東西。
這裡在 Playground 實際操作一下。
可以看到第三行的 Text 的類型就是 Text,但是第四行同樣的 Text 後面加上 .padding() 它的類型就變成 ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout> 這一長串。
然後可以看到第五行,再加上一個 modifier 之後,它的類型變成 ModifiedContent<SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>, SwiftUI._EnvironmentKeyWritingModifier<Optional<SwiftUI.Color>>> 這一長串的類型。
所以在正常使用 SwiftUI 時,會加上大量的 modifier,然後它的類型就會變成不可名狀之物,看了直接當場掉 san,但是這些類型又是不可或缺的,因為 SwiftUI 需要具體的類型來幫助執行。
在上面提到了,加上 modifier 之後,它的類型變的超長,這對開發者來說完全沒有意義,但 SwiftUI 需要具體的類型來幫助執行。只是我們不需要告訴 SwiftUI 他的具體類型是什麼,SwiftUI 會自己去檢查詳細的具體類型。
只有兩個 modifier 它的類型就變得這麼可怕,那像上面那樣好幾個 modifier,太可怕了。
所以這時候我們使用 some 這個關鍵字來說明:這裡是一個開發者不需要知道他的具體類型的 View 類型,但是這裡有且只有一種類型,SwiftUI 還是需要仔細檢查這裡的類型。
現在來回憶一下昨天提到的東西 .resizable()。
.resizable() 這個 modifier 是只能用在 Image 這個 View 上,他還很嚴格 .resizable() 也不能加在 modifier 的後面,原因就是因為 .resizable() 只能用在 Image 這個類型上。
但是一個 Image 加上其他的 modifier 之後,他的類型就變成 some View 了,也就是那一長串的類型。這時候 .resizable() 就不能使用了。
不過像是 .resizable() 這種跟特定類型綁定的 modifier 並不多,偶爾遇到的時候注意一下 modifier 的位置就好。
那今天關於 some View 的內容就到這裡,明天來說一下 SwiftUI 的排版。